package org.upo.eps.it.phama.dao;

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.upo.eps.it.phama.bean.Cliente;
import org.upo.eps.it.phama.bean.PedidoCliente;
import org.upo.eps.it.phama.util.HibernateUtil;

/**
 *
 * @author grupo 4
 */
public class ClienteDAO {
/**
     * Devuelve un objeto de la clase Cliente cuyos atributo idCliente
     * corresponda con el aportado como parámetro. Como el atributo user es
     * único, el método sólo puede devolver un objeto o nulo, si no se
     * encontrara.
     *
     * @param idCliente Integer con el identificador del cliente.
     * @return Objeto de la clase Cliente o nulo.
     */
    public static Cliente getById(int idCliente) {
        Cliente resultado;

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();        
        resultado = (Cliente) session.get(Cliente.class, idCliente);
        session.close();

        return resultado;
    }
    
    /**
     * Obtiene una lista con todos los clientes existentes en la base de datos.
     *
     * @return Lista de objetos de la clase Cliente.
     */
    public static List<Cliente> getCliente() {
        List<Cliente> clientes;
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String sql = "from Cliente";
        Query qry = session.createQuery(sql);
        clientes = (List<Cliente>) qry.list();
        session.close();

        return clientes;
    }
    
     /**
     * Efectúa la búsqueda de todos aquéllos clientes cuyos atributos
     * correspondan con todos los parámetros recibidos. Si no se aporta algún
     * parámetro, el mismo será sustituido por el comodín que implica a todos.
     * Como la cadena de búsqueda se construye a base de comparadores
     * <code>like</code>, los parámetros pueden contender el comodín
     * <code>%</code>.
     *
     * @param nombre String con el nombre del cliente que se busca.
     * @param contacto String con contacto que ha sido registrado del cliente.
     * @param email String con el email de cliente.
     * @param telefono String con el numero de telefono que pertenece al cliente.
     * @return Lista de objetos de la clase Cliente que cumplen con los
     * parámetros aportados.
     */
    public static List<Cliente> search(String nombre, String contacto, String email, String telefono) {
        /* Si algún parámetro no tuviera contenido, se sustituye por el comodín %, que indica que se ese campo NO se tendrá
         * en cuenta en la búsqueda.
         */
        List<Cliente> resultado;
        String n = nombre.trim().isEmpty() ? "%" : nombre.trim();
        String c = contacto.trim().isEmpty() ? "%" : contacto.trim();
        String e = email.trim().isEmpty() ? "%" : email.trim();
        String t = telefono.trim().isEmpty() ? "%" : telefono.trim();

        /* Finalmente, se construye la cadena sql a base de comparadores like y se ejecuta
         * la consulta.
         */
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        String sql = String.format("from Cliente where nombre like '%s' and contacto like '%s' and email like '%s' and telefono like '%s' ", n, c, e, t);
        Query qry = session.createQuery(sql);
        resultado = (List<Cliente>) qry.list();
        session.close();

        return resultado;
    }

      /**
     * Se hace persistente el cliente recibido como parámetro.
     *
     * @param cliente Objeto de la clase Cliente.
     * @throws HibernateException
     */
    public static void save(Cliente cliente) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
             // Se guarda el cliente tanto si es nuevo como si ya existe previamente en la base de datos.
            session.saveOrUpdate(cliente.getDireccion());
            session.saveOrUpdate(cliente);
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            throw ex;
        }
    }

     /**
     * Se elimina de la base de datos el cliente cuyo id se recibe como
     * parámetro.
     *
     * @param id Integer con el id del cliente que se quiere eliminar.
     * @throws HibernateException
     */
    public static void delete(int id) throws HibernateException {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
            Query qry = session.createQuery(String.format("delete Cliente where idCliente = %d", id));
            qry.executeUpdate();
            session.getTransaction().commit();
        } catch (HibernateException ex) {
            session.getTransaction().rollback();
            throw ex;
        }
    }
}
